#include <stdio.h>
#include <stdlib.h>

#include "unistd.h"
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_pwm.h"
#include "time.h"
#include "sg92.h"

#define COUNT 10             // 每个角度设置发送PWM信号的次数
#define FREQ_TIME 20000      // PWM周期为20ms（50Hz）
#define IOT_IO_NAME_GPIO_2 2 // 舵机控制引脚
// 红灯和绿色表示工作状态
#define RED_GPIO_0 0
#define GREEN_GPIO_1 1

#define GPIO_HIGH 1
#define GPIO_LOW 0

void SetAngle(unsigned int duty)
{
    unsigned int time = FREQ_TIME;
    // 设置GPIO引脚为高电平
    IoTGpioSetOutputVal(IOT_IO_NAME_GPIO_2, GPIO_HIGH);
    // 延迟指定的高电平时间
    hi_udelay(duty);
    // 设置GPIO引脚为低电平
    IoTGpioSetOutputVal(IOT_IO_NAME_GPIO_2, GPIO_LOW);
    // 延迟剩余的时间以完成一个完整的PWM周期
    hi_udelay(time - duty);
}

int OpenTask(int sockfd)
{
    send(sockfd, "opening......", sizeof("opening......"), 0);
    IoTGpioSetOutputVal(GREEN_GPIO_1, GPIO_HIGH);
    for (int angle = 350; angle < 2700; angle += 25)
    {
        SetAngle(angle);
        usleep(1000);
    }
    IoTGpioSetOutputVal(GREEN_GPIO_1, GPIO_LOW);
    send(sockfd, "door is opened", sizeof("door is opened"), 0);
    return 1;
}

int CloseTask(int sockfd)
{
    send(sockfd, "closing......", sizeof("closing......"), 0);
    IoTGpioSetOutputVal(RED_GPIO_0, GPIO_HIGH);
    for (int angle = 2700; angle > 350; angle -= 25)
    {
        SetAngle(angle);
        usleep(10000);
    }
    IoTGpioSetOutputVal(RED_GPIO_0, GPIO_LOW);
    send(sockfd, "door is closed", sizeof("door is closed"), 0);
    return 0;
}

// void red_blink(void)
// {
//     init_gpio();
//     printf("red_blink");
//     IoTGpioSetOutputVal(RED_GPIO, IOT_GPIO_VALUE1);
//     usleep(1000000);
//     IoTGpioSetOutputVal(RED_GPIO, IOT_GPIO_VALUE0);
// }